package reentrantLock;

import java.util.concurrent.locks.ReentrantLock;

// 测试ReentrantLock这个锁
public class ReentrantLockTest {
    // ReentrantLock使用手动的加锁解锁的方式
    // 1、在if return; 抛出异常的时候，可能会忘了unlock导致问题。怎么解决？使用try catch finally(这里释放锁)
    // 2、在new的时候加个true参数代表是公平锁，不加或者加false为非公平锁。
    // 3、对synchronized来说，加锁操作是死等，只有获取不到锁，就一直阻塞等待。
    //    但是ReentrantLock则更加灵活：tryLock
    //    且tryLock方法一个无参(加不上锁就放弃)，一个有参(加不上锁，等一段时间，超过时间就放弃加锁)
    // 4、ReentrantLock提供了一个更强大更方便的，等待通知机制
    //      synchronized搭配的是wait notify 时随机唤醒一个线程
    //      ReentrantLock搭配一个Condition类，可以唤醒指定的线程
    public static void main(String[] args) {
        ReentrantLock reentrantLock = new ReentrantLock();
        boolean result = reentrantLock.tryLock();
        reentrantLock.lock();
        try {
            if(result){
                // 代表获取到锁，执行相应的需要加锁的代码
            }{
                // 未获取到锁，不执行要加锁部分代码。
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (result){
                reentrantLock.unlock();
            }
        }
    }
}
